gl: avoid calculating vertex_data until necessary
authorChristian Hergert <chergert@redhat.com>
Sun, 13 Oct 2019 23:39:54 +0000 (16:39 -0700)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 15 Oct 2019 23:44:26 +0000 (19:44 -0400)
In many cases of the switch, we do not need the vertex data. This moves
the creation of the vertex_data array into a secondary function and only
calculates it the cases for which it is required.

gsk/gl/gskglrenderer.c

index a52b94031162b0487a3075c75a7879ad0c6dff61..6ea752561ec02bef51c033ebf3e1629b69fa761d 100644 (file)
@@ -2703,26 +2703,53 @@ gsk_gl_renderer_setup_render_mode (GskGLRenderer *self)
     }
 }
 
-
 static void
-gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
-                                GskRenderNode   *node,
-                                RenderOpBuilder *builder)
+load_vertex_data (GskQuadVertex    vertex_data[GL_N_VERTICES],
+                  GskRenderNode   *node,
+                  RenderOpBuilder *builder)
 {
   const float min_x = builder->dx + node->bounds.origin.x;
   const float min_y = builder->dy + node->bounds.origin.y;
   const float max_x = min_x + node->bounds.size.width;
   const float max_y = min_y + node->bounds.size.height;
-  /* Default vertex data */
-  const GskQuadVertex vertex_data[GL_N_VERTICES] = {
-    { { min_x, min_y }, { 0, 0 }, },
-    { { min_x, max_y }, { 0, 1 }, },
-    { { max_x, min_y }, { 1, 0 }, },
 
-    { { max_x, max_y }, { 1, 1 }, },
-    { { min_x, max_y }, { 0, 1 }, },
-    { { max_x, min_y }, { 1, 0 }, },
-  };
+  vertex_data[0].position[0] = min_x;
+  vertex_data[0].position[1] = min_y;
+  vertex_data[0].uv[0] = 0;
+  vertex_data[0].uv[1] = 0;
+
+  vertex_data[1].position[0] = min_x;
+  vertex_data[1].position[1] = max_y;
+  vertex_data[1].uv[0] = 0;
+  vertex_data[1].uv[1] = 0;
+
+  vertex_data[2].position[0] = max_x;
+  vertex_data[2].position[1] = min_y;
+  vertex_data[2].uv[0] = 0;
+  vertex_data[2].uv[1] = 0;
+
+  vertex_data[3].position[0] = max_x;
+  vertex_data[3].position[1] = max_y;
+  vertex_data[3].uv[0] = 0;
+  vertex_data[3].uv[1] = 0;
+
+  vertex_data[4].position[0] = min_x;
+  vertex_data[4].position[1] = max_y;
+  vertex_data[4].uv[0] = 0;
+  vertex_data[4].uv[1] = 0;
+
+  vertex_data[5].position[0] = max_x;
+  vertex_data[5].position[1] = min_y;
+  vertex_data[5].uv[0] = 0;
+  vertex_data[5].uv[1] = 0;
+}
+
+static void
+gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
+                                GskRenderNode   *node,
+                                RenderOpBuilder *builder)
+{
+  GskQuadVertex vertex_data[GL_N_VERTICES];
 
   /* This can still happen, even if the render nodes are created using
    * GtkSnapshot, so let's juse be safe. */
@@ -2776,6 +2803,7 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     break;
 
     case GSK_COLOR_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_color_node (self, node, builder, vertex_data);
     break;
 
@@ -2792,6 +2820,7 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     break;
 
     case GSK_LINEAR_GRADIENT_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_linear_gradient_node (self, node, builder, vertex_data);
     break;
 
@@ -2809,25 +2838,34 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer   *self,
     break;
 
     case GSK_COLOR_MATRIX_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_color_matrix_node (self, node, builder, vertex_data);
     break;
 
     case GSK_BLUR_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_blur_node (self, node, builder, vertex_data);
     break;
 
     case GSK_INSET_SHADOW_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_inset_shadow_node (self, node, builder, vertex_data);
     break;
 
     case GSK_OUTSET_SHADOW_NODE:
       if (gsk_outset_shadow_node_get_blur_radius (node) > 0)
-        render_outset_shadow_node (self, node, builder);
+        {
+          render_outset_shadow_node (self, node, builder);
+        }
       else
-        render_unblurred_outset_shadow_node (self, node, builder, vertex_data);
+        {
+          load_vertex_data (vertex_data, node, builder);
+          render_unblurred_outset_shadow_node (self, node, builder, vertex_data);
+        }
     break;
 
     case GSK_SHADOW_NODE:
+      load_vertex_data (vertex_data, node, builder);
       render_shadow_node (self, node, builder, vertex_data);
     break;